/*
 * @Date: 2023-05-14 00:00:10
 * @LastEditors: cjx
 * @LastEditTime: 2023-05-14 01:06:04
 * @Description: 排序相关逻辑处理文件
 */
import { computed } from 'vue'

interface ISortParmas {
  column: any
  key: string
  order: string
}

interface ITableOptions {
  tableData: any[]
  pageNum: number
  currentPageSize: number
  count: number
  noDataText: string
  tableHeight: number | string
  loading: boolean
  selectedId: string[]
  selectedRows: any[]
  equNum: number
  canQuery: boolean
}

/**
 * @param config 全局配置属性
 * @param props 本地组件中的属性集合
 * @returns Object
 */
export default function (config: any, props: any) {
  const allSortAble = computed((): boolean => props.allSortable || config.table?.allSortable)
  const addSortColumnsWidth = (column: any, width: number) => {
    if (column.width) {
      column.width = column.width ? +column.width + width : ''
    }
  }

  /**
   * 是否开启排序设置
   * @param column 表格列属性集合
   */
  const sortSet = (column: any) => {
    if (allSortAble.value) {
      if (column.title !== '序号' && column.title !== '操作' && column.title !== '选中') {
        column.sortable = 'custom'
        addSortColumnsWidth(column, 10)
      }
    } else {
      if (props.sortAbleCols.includes(column.key)) {
        column.sortable = 'custom'
        addSortColumnsWidth(column, 10)
      }
    }
  }

  /**
   * 前端排序
   * @param params 当前操作列属性
   * @param tableOptions 表格操作属性集合
   */
  const webSortHandle = (params: ISortParmas, tableOptions: ITableOptions) => {
    const tableData = tableOptions.tableData.sort((a, b) => {
      const valA = a[params.key] || ''
      const valB = b[params.key] || ''

      // 非英文语言的字符串需转换后排序
      if (params.order === 'desc') {
        return valB.localeCompare(valA, 'zh')
      } else if (params.order === 'asc') {
        return valA.localeCompare(valB, 'zh')
      } else {
        return
      }
    })

    // 重置序号
    tableOptions.tableData = tableData.map((item, index) => {
      const no = index + (tableOptions.pageNum - 1) * tableOptions.currentPageSize + 1
      return { ...item, index: no, ROWNUM_: no }
    })
  }

  /**
   * 服务端排序
   * @param params 当前操作列属性集合
   * @param fetchParams 表格查询条件集合
   */
  const remoteSortHandle = (params: ISortParmas, fetchParams: any) => {
    let orderBy = params.key + ' ' + params.order

    // 使用列名匹配自定义的排序字段
    // orderByColumnFields = {'设备识别码': 'dbName'}
    // 当column.title === '设备识别码'时，就会使用column.dbName的值作为排序字段
    const field = props.orderByColumnFields[params.column.title]
    if (field) {
      let sortKey = params.column[field]
      if (sortKey) {
        orderBy = params.column[field] + ' ' + params.order
      } else {
        console.warn('表格列配置没有需要的字段: ' + sortKey)
      }
    }

    // 使用列名匹配自定义的排序字段
    // 例orderByColumnAlias = {'设备识别码': 'sbsbm'}
    // 当column.title === '设备识别码'时，就会使用'sbsbm'作为排序字段
    const alias = props.orderByColumnAlias[params.column.title]
    if (alias) {
      orderBy = alias + ' ' + params.order
    }
    fetchParams.value['orderBy'] = orderBy
  }
  return {
    sortSet,
    webSortHandle,
    remoteSortHandle
  }
}
